function wayfind(st,fn)

	-- проверка входящих значений
	if type(st) == 'table' then st = deref(st) end
	if type(fn) == 'table' then fn = deref(fn) end

	-- инициализация локальных переменных
	local mass_old = {}			-- массив маршрутов старой волны
	local mass_new = {}			-- массив маршрутов новой волны
	local mass_use = {}			-- массив использованых точек маршрутов
	local mo,mu,w,n				-- счетчики
	local deadway,used			-- идентификаторы
	local deadlock = false		-- маршрута не существует
	local outp					-- возращаемый маршрут
	local wave = 0				-- номер волны

	-- начальные установки
	table.insert(mass_new,deepcopy({st}))
	table.insert(mass_use,deepcopy(st))

	-- выполнять поиск, пока маршрут не будет найден, либо все пути будут в тупике
	while not deadlock do

		-- проверка на отсутствие пути до финиша (может можно сделать красивее?)
		n = 0;
		if #mass_old == #mass_new then
			for mo = 1, #mass_old do
				if #mass_old[mo] == #mass_new[mo] then n = n + 1 end
			end

			if n == #mass_old then
				if type(fn) == 'number' then return mass_old
				else return 'deadlock'
				end
			end
		end

		mass_old = deepcopy(mass_new)
		mass_new = {}

		-- проверка окончания вычислений
		if type(fn) == 'number' then
			if wave == fn then return mass_old end
		else
			for mo = 1, #mass_old do
				if mass_old[mo][#mass_old[mo]] == fn then
					return mass_old[mo]
				end
			end
		end

		-- перебор маршрутов старой волны
		for mo = 1, #mass_old do
			-- проверка на наличие путей из точки
			deadway = false;
			n = 0;
			if #ways(ref(mass_old[mo][#mass_old[mo]])) ~= 0 then
				for w = 1, #ways(ref(mass_old[mo][#mass_old[mo]])) do
					for mu = 1, #mass_use do
						if deref(ways(ref(mass_old[mo][#mass_old[mo]]))[w]) == mass_use[mu] then n = n + 1 end
					end
				end
				if n == #ways(ref(mass_old[mo][#mass_old[mo]])) then deadway = true end		-- все возможные пути использованы
			else deadway = true			-- пути из точки отсутствуют
			end
			if not deadway then
				for w = 1, #ways(ref(mass_old[mo][#mass_old[mo]])) do
					used = false
					for mu = 1, #mass_use do
						if deref(ways(ref(mass_old[mo][#mass_old[mo]]))[w]) == mass_use[mu] then used = true end
					end
					if not used then
						table.insert(mass_new,deepcopy(mass_old[mo]))
						table.insert(mass_new[#mass_new],deepcopy(deref(ways(ref(mass_old[mo][#mass_old[mo]]))[w])))
						table.insert(mass_use,deepcopy(deref(ways(ref(mass_old[mo][#mass_old[mo]]))[w])))
					end
				end
			else table.insert(mass_new,deepcopy(mass_old[mo]))		-- добавление маршрута без изменений
			end
		end
		wave = wave + 1
	end
end

-- функция копирования таблиц
function deepcopy(object)
    local lookup_table = {}
    local function _copy(object)
        if type(object) ~= "table" then
            return object
        elseif lookup_table[object] then
            return lookup_table[object]
        end
        local new_table = {}
        lookup_table[object] = new_table
        for index, value in pairs(object) do
            new_table[_copy(index)] = _copy(value)
        end
        return setmetatable(new_table, getmetatable(object))
    end
    return _copy(object)
end;
